//信号基本结论：
//1.信号处理，我在信号没有产生的时候，就知道信号该如何处理
//2.信号的处理，不是立即处理，而是可以等一会再处理，合适的时候，进行信号处理
//3.人能识别信号，是提前被“教育”过的，进程也是如此，OS程序员设计的进程，进程早已内置了信号的处理和识别
//4.信号源非常多->给进程产生信号的，信号源也特别多！


//信号的产生
//1.键盘产生信号 ctrl+c是给目标进程发送信号的，相当一部分信号的处理，就是让自己处理
//a.信号有哪些  ，ctrl+c就是给进程发送信号  发哪一个信号？
//收到信号，处理信号  1.默认处理 2.自定义信号处理  3.忽略处理
//b.怎么证明  看到信号处理的过程--->尝试更改进程的默认处理的动作
//c.目标进程？？ 前台和后台进程
//#./XXX----前台进程    -----键盘产生的信号只在前台
//#./YYY----后台进程   --->ctrl+c不做处理
//命令行shell进程----前台

//后台进程 不能从标准输入中获取内容  
//前台进程 能从键盘获取标准输入   本质就是要从键盘获取数据
//  都可以向标准输出上打印

//补充一部分命令，前后台移动
//jobs 查看所有的后台任务
//fg 任务号，特定的进程，提到前台
//ctrl+z 进程切换到后台
//bg 任务号：让后台进行回复进行

//d.什么叫做给进程发送信号？   
//信号产生之后，并不是立即处理，所以要求，进程必须把信号记录下来
//记录在哪里？  位图结构
//如何记录？ 
//发送信号，本质是什么？？--->向目标进程写信号  修改位图 pid,信号的编号

//2.系统调用


#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

void handlerSig(int sig)
{
    std::cout<<"获得了一个信号"<<sig<<std::endl;
    //exit(12);
}

int main()
{
    for(int i=0;i<32;i++)
        signal(SIGINT,handlerSig);
    //for(int i=1;i<32;i++)
    //{
        //sleep(1);
        //if(i==9||i==19)
            //continue;
        //raise(i);
    //}
    int cnt=0;
    while(true)
    {
        std::cout<<"hello world"<< cnt++ <<"，pid:"<<getpid()<<std::endl;
        //abort();
        sleep(1);
        int a=10;
        //a/=0;
        int *p=nullptr;
        *p=100;
    }
    return 0;
}